﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using Liang.DataBase.BLL;
using Liang.DataBase.Model.Entity;
using Liang.DataBase.Tools;
using Liang.UI;

namespace Client
{
    public partial class FrmModuleEdit : Form
    {
        ModuleBLL moduleBLL = new ModuleBLL();

        sys_module module { get; set; }

        IList<sys_app> apps = null;

        public FrmModuleEdit()
        {
            InitializeComponent();
        }

        public FrmModuleEdit(sys_module module)
        {
            InitializeComponent();
            this.module = module;
        }

        private void FrmModelEdit_Load(object sender, EventArgs e)
        {
            init();
        }

        void init()
        {
            // 注意：如果需要关联app到module，则必须通过ModuleBLL对象拿到app的集合
            // 否则，拿到的app与module不在一个dbContext
            //apps = moduleBLL.GetApps(module);
            apps = moduleBLL.GetApps();
            IList<sys_app> tmp = new List<sys_app>();

            if (null != module)
            {
                this.Text = "功能组合-修改";
                this.txtName.Text = module.name;
                this.txtImgUrl.Text = module.imgUrl;
                this.txtDes.Text = module.des;

                tmp = module.apps.ToList();
            }
            else
            {
                this.Text = "功能组合-新增";
            }

            foreach (sys_app itemApp in apps)
            {
                ListViewItem lvItem = this.listView_Apps.Items.Add(itemApp.name);
                // 判断当前app是否已分配给了当前role
                var n = tmp.Where(q => q.appId.Equals(itemApp.appId));
                if (0 < n.Count())
                {
                    lvItem.Checked = true;
                }
                lvItem.Tag = itemApp;
            }

            // 初始化列表控件里的apps
            //foreach (sys_app item in apps)
            //{
            //    ListViewItem lvItem = this.listView_Apps.Items.Add(item.name);

            //    if (null != module)
            //    {
            //        IEnumerable<sys_app> tmp = module.apps.Where(p => p.appId.Equals(item.appId));
            //        if (0 < tmp.Count())
            //        {
            //            lvItem.Checked = true;
            //        }
            //    }

            //    lvItem.Tag = item;
            //}
        }

        /// <summary>
        /// 获取已分配给当前module的apps
        /// </summary>
        IList<sys_app> getSelectedApps()
        {
            IList<sys_app> ret = new List<sys_app>();

            foreach (ListViewItem item in this.listView_Apps.Items)
            {
                if (item.Checked)
                {
                    ret.Add((sys_app)item.Tag);
                }
            }

            return ret;
        }

        public bool validate()
        {
            if (string.IsNullOrEmpty(txtName.Text))
            {
                MessageBoxEx.Show(this, "请输入组合名称。");
                this.txtName.Focus();
                return false;
            }

            if (string.IsNullOrEmpty(txtDes.Text))
            {
                MessageBoxEx.Show(this, "请输入描述。");
                this.txtDes.Focus();
                return false;
            }

            if (string.IsNullOrEmpty(txtImgUrl.Text))
            {
                MessageBoxEx.Show(this, "请输入图片路径。");
                this.txtImgUrl.Focus();
                return false;
            }

            if (module == null)
            {
                sys_module tmp = moduleBLL.FindSingle(LambdaHelper.True<sys_module>().And(p => p.name.Equals(txtName.Text)));
                if (null != tmp)
                {
                    MessageBoxEx.Show(this, string.Format("名称：{0} 已存在，请重新输入一个名称", txtName.Text));
                    this.txtName.Focus();
                    return false;
                }
            }
            return true;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (validate())
            {   
                if (null == module)
                {
                    module = new sys_module();
                    module.name = txtName.Text;
                    module.des = txtDes.Text;
                    module.imgUrl = txtImgUrl.Text;
                    module.apps = getSelectedApps();
                    moduleBLL.Insert(module);
                }
                else
                {
                    module = moduleBLL.FindByID(module.moduleId);
                    module.name = txtName.Text;
                    module.des = txtDes.Text;
                    module.imgUrl = txtImgUrl.Text;

                    // 获取选中的appId
                    IList<sys_app> selectedApps = getSelectedApps();
                    var selectedAppIds = new HashSet<Guid>(selectedApps.Select(q => q.appId));

                    // 查询当前module包含的 app 的 appId
                    var moduleAppIds = new HashSet<Guid>(module.apps.Select(q => q.appId));

                    // 
                    foreach (sys_app item in apps)
                    {
                        if (selectedAppIds.Contains(item.appId))
                        {
                            if (!moduleAppIds.Contains(item.appId))
                            {
                                module.apps.Add(item);
                            }
                        }
                        else
                        {
                            if (moduleAppIds.Contains(item.appId))
                            {
                                module.apps.Remove(item);
                            }
                        }
                    }

                    moduleBLL.Update(module, module.moduleId);
                }

                DialogResult = DialogResult.OK;
                this.Close();
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}
